﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.Net;
using System.IO;
using System.Diagnostics;

namespace ANGF
{
    public partial class FormFatalWarn : Form
    {
        private string message;
        private bool bSave;
        public FormFatalWarn(string message, bool bSave)
        {
            this.message = message;
            this.bSave = bSave;
            InitializeComponent();
        }

        private string createText()
        {
            var sb = new StringBuilder();
            sb.Append("ANGF Version ");
            sb.AppendLine(Application.ProductVersion);
            sb.Append("OS: ");
            sb.AppendLine(System.Environment.Is64BitOperatingSystem ? "64bit" : "32bit");
            sb.Append("Process: ");
            sb.AppendLine(System.Environment.Is64BitProcess ? "64bit" : "32bit");
            sb.Append("OSVersion: ");
            sb.AppendLine(System.Environment.OSVersion.ToString());
            sb.Append(".NET F/W: ");
            sb.AppendLine(System.Environment.Version.ToString());
            sb.Append(message);
            sb.AppendLine();
            sb.AppendLine();
            foreach (var item in AppDomain.CurrentDomain.GetAssemblies())
            {
                //sb.Append("Assembly Fullpath: ");
                //sb.AppendLine(item.Location);
                //sb.Append("Assembly FullName: ");
                //sb.AppendLine(item.FullName);
                //sb.Append("Assembly Version: ");
                //sb.AppendLine(item.GetName().Version.ToString());
                if (!string.IsNullOrWhiteSpace(item.Location))
                {
                    FileVersionInfo ver = FileVersionInfo.GetVersionInfo(item.Location);
                    //sb.Append("Assembly File Version: ");
                    sb.AppendLine(ver.ToString());
                }
            }
            return sb.ToString();
        }

        private void FormFatalWarn_Load(object sender, EventArgs e)
        {
            textBox1.Text = createText();
            if (bSave)
            {
                label2.Text = @"ご迷惑をお掛けします。
処理されない例外が発生しました。この情報をファイルに保存することができます。
保存される内容は以下の通りです。
開発の助けになるので、情報内容に問題ない場合は開発者に御送信ください。
万一、開示したくない個人情報が含まれる場合はキャンセルしてください。
お手数をお掛けいたします。";
                buttonTransmit.Text = "保存(&S)";
            }
            else
            {
                label2.Text = @"ご迷惑をお掛けします。
処理されない例外が発生しました。この情報を開発元に送信することができます。
送信される内容は以下の通りです。
開発の助けになるので、情報内容に問題ない場合は御送信ください。
万一、開示したくない個人情報が含まれる場合はキャンセルしてください。
お手数をお掛けいたします。";
                buttonTransmit.Text = "送信(&S)";
            }
        }

        private void buttonTransmit_Click(object sender, EventArgs e)
        {
            if (bSave)
            {
                saveFileDialog.FileName = "fatal report" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";
                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        File.WriteAllText(saveFileDialog.FileName, this.textBox1.Text, Encoding.Default);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(this, ex.ToString(), "Save Error");
                    }
                }
            }
            else
            {
                var c = new WebClient();
                var ps = new System.Collections.Specialized.NameValueCollection();
                ps.Add("message", textBox1.Text);
                Cursor.Current = Cursors.WaitCursor;
                var values = c.UploadValues("http://autumn.cloudapp.net/reporthandler/autoentry.aspx", ps);
                Cursor.Current = Cursors.Default;
                DialogResult = System.Windows.Forms.DialogResult.OK;
                Close();
            }
        }

        private void buttonCancel_Click(object sender, EventArgs e)
        {
            DialogResult = System.Windows.Forms.DialogResult.Cancel;
            Close();
        }
    }
}
